package com.whut.monitor.netty;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;

// 客户端设计思路：
// 客户端与服务端建立连接，选择客户端本地文件，先将文件名及大小的属性发送给服务端，再将文件通过流的方式传输给
// 服务端。传输的进度打印到控制台中，直到传输完成。
public class FileTransferClient extends Socket {

    private static final String SERVER_IP = "127.0.0.1"; // 服务端IP地址
    private static final int SERVER_PORT = 8089; // 服务端端口号

    private Socket client;

    private FileInputStream fis;

    private DataOutputStream dos;

    /**
     * 构造函数<br/>
     * 与服务器建立连接
     * @throws Exception
     */
    public FileTransferClient() throws Exception {
        super(SERVER_IP, SERVER_PORT);
        this.client = this;
        System.out.println("Cliect[port:" + client.getLocalPort() + "] 成功连接服务端");
    }

    /**
     * 向服务端传输文件
     */
    public void sendFile(File file) throws Exception {
        try {
//            File file = new File("E:\\2.jpg");
            if(file.exists()) {
                fis = new FileInputStream(file);
                dos = new DataOutputStream(client.getOutputStream());

                // 文件名和长度
                dos.writeUTF(file.getName());
                dos.flush();//将缓冲区里的东西强行写入输出流
                dos.writeLong(file.length());
                dos.flush();

                // 开始传输文件
                System.out.println("======== 开始传输文件 ========");
                byte[] bytes = new byte[1024];//每次写入的大小
                int length = 0;
                long progress = 0;
                while((length = fis.read(bytes, 0, bytes.length)) >0) {
                    dos.write(bytes, 0, length);
                    dos.flush();
                    progress += length;
                    System.out.print("| " + (100*progress/file.length()) + "% |");
                }
                System.out.println();
                System.out.println("======== 文件发送成功 ========");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(fis != null)
                fis.close();
            if(dos != null){
                dos.close();
                client.close();
            }

        }
    }

    /**
     * 入口
     * @param args
     */
//    public static void main(String[] args) {
//        try {
//            FileTransferClient client = new FileTransferClient(); // 启动客户端连接
//            client.sendFile(); // 传输文件
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

}


